package com.hds.modules.app.entity.wx.utils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.dom4j.Element;
import com.jfinal.kit.EncryptionKit;
import com.hds.modules.app.entity.wx.common.WxConstants;

/**
 * 微信支付工具类
 * @version 1.0
 */
public class WxPayUtils {

    /**
     * 微信支付参数带APIKey，MD5签名
     * param1="1"&param2="2"&key=apikey
     * 无值参数会自动过滤不参与签名
     * @param paramNames    需求签名的参数名称
     * @param paramValueMap 需求签名的参数值，Map的key与paramNames对应
     * @return
     */
    public static String getPaySignMD5(String[] paramNames,Map<String,String> paramValueMap)
    {
        Arrays.sort(paramNames);

        StringBuffer signsb = new StringBuffer();

        String paramValueTemp = "";
        String paramNameTemp = "";

        for(int i=0;i<paramNames.length;i++)
        {
            paramNameTemp = paramNames[i];

            paramValueTemp = (String)paramValueMap.get(paramNameTemp);

            if(paramValueTemp!=null && !"".equals(paramValueTemp))
            {
                signsb.append(paramNameTemp+"="+paramValueTemp+"&");
            }
        }
        signsb.append("key="+paramValueMap.get(WxConstants.APIKEY));
        //MD5加密
        String sign = EncryptionKit.md5Encrypt(signsb.toString()).toUpperCase();

        return sign;
    }

    /**
     * 获取签名数据
     * 由于微信文档说明可能会随时对返回数据增加字段，
     * 所以为能正确验签要动态获取参加验签的数据
     * @param root
     * @param paramNameList
     * @param paramValueMap
     */
    public static void getSignData(Element root,List<String> paramNameList,Map<String,String> paramValueMap)
    {

        List rootChild = root.elements();

        int rootChildNum = rootChild.size();
        Element temp = null;
        String tempName = "";

        for(int i=0;i<rootChildNum;i++)
        {
            temp = (Element)rootChild.get(i);
            tempName = temp.getName();
            if(!"sign".equals(tempName))
            {
                paramNameList.add(tempName);

                paramValueMap.put(tempName, temp.getTextTrim());
            }
        }
    }
}